package web;

import java.io.IOException;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import model.Accion;
import model.Precio;

import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import service.ServiceProvider;

//Clase para obtener los precios del dia para todas las acciones principales

public class AmbitoDiarioServlet extends HttpServlet {
	
	private static final long serialVersionUID = 1L;
	
	private static final int COLUMNA_NOMBRE = 0;
	private static final int COLUMNA_PRECIO_CIERRE = 3;
	private static final int COLUMNA_ULTIMA_OPERACION = 5;
	
	private static final String AMBITO_DIARIO_URL = "http://www.ambito.com/economia/mercados/indices/merval/"; 
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
        resp.setContentType("text/html");
        boolean success = false;
        Document d = null;
        try {
        	Connection c = Jsoup.connect(AMBITO_DIARIO_URL);
        	d = c.get();
        	success = true;
        } catch (Exception e){
        	success = false;
        }
        
        if (!success){
        	PrintWriter out = resp.getWriter();
            out.println("<HEAD><TITLE>Cotizaciones ambito.com</TITLE></HEAD><BODY>");
            out.println("<a href=\"/tpfinal\">Menu</a>");
            out.println("NO SE PUDO OBTENER LOS PRECIOS - REVISE SU CONEXION");
            out.println("</BODY>");
            return;
        } 
        
        Elements tables = d.getElementsByClass("tablaMercados");
        boolean panelGeneralTable = true;
        
        List<Accion> acciones = new ArrayList<Accion>();
        
        // Tablas de la pagina
        for (int i = 0; i < tables.size(); i++){
        	Element e = tables.get(i);
        	
        	Elements tableRows = e.select("tr");
        	// Row de la tabla
        	for (int j = 0; j < tableRows.size() && panelGeneralTable; j++){
        		Accion a = new Accion();
        		Precio p = new Precio();
        		
        		Element tableRow = tableRows.get(j);        		
        		Elements tableRowData = tableRow.select("td");        		
        		// Datos de cada row
        		for (int k = 0; k < tableRowData.size(); k++){
        			Element td = tableRowData.get(k);
        			String tdText = td.getAllElements().iterator().next().ownText();
        			String hRef = "";
        			
        			if (j > 0 && k == COLUMNA_NOMBRE){
        				Elements aTag = td.select("a");
        				if (aTag.size() > 0){
        					tdText = aTag.get(0).getAllElements().iterator().next().ownText();
        					hRef = aTag.get(0).attr("href");
        					String ric = hRef.substring(hRef.lastIndexOf('=') + 1);
        					Accion existe = ServiceProvider.getDao().getAccionByRic(ric);
        					if (existe != null){
        						a = existe;
        					}
        					a.setRic(ric);        					
        				}        				
        			}
        			
        			if (k == COLUMNA_NOMBRE && j == 0){
        				if (!"PANEL GENERAL".equalsIgnoreCase(tdText)){
        					panelGeneralTable = false;
        					break;
        				}
        			}
        			
        			if (k == 0){
        				a.setNombre(tdText);
        			}
        			if (k == COLUMNA_PRECIO_CIERRE && j > 0){
        				String num = tdText.replace(".", ""); 
        				p.setValor(new BigDecimal(num.replace(',', '.')));
        			} 
        			if (k == COLUMNA_ULTIMA_OPERACION && j > 0){
        				Date fecha = null;
        				SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        				try {
        					String fechaSinHora = tdText.substring(0, 10);
							fecha = sdf.parse(fechaSinHora);
						} catch (ParseException e1) {
							e1.printStackTrace();
						}
        				if (fecha == null){
        					fecha = new Date();
        				}
        				p.setFecha(fecha);
        			}
        		}	
        		if (panelGeneralTable && j > 0){
        			acciones.add(a);
        		}
        		a.agregarPrecio(p);        		
        	}
        	panelGeneralTable = true;
        }
        
        // then get the writer and write the response data
        PrintWriter out = resp.getWriter();
        out.println("<HEAD><TITLE>Cotizaciones ambito.com</TITLE></HEAD><BODY>");
        out.println("<a href=\"/tpfinal\">Menu</a>");
        out.println("<table>");
        out.println("<tr><td>RIC</td><td>NOMBRE</td><td>PRECIO</td><td>FECHA</td></tr>");
        for (Accion a : acciones){
        	SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        	String fechaStr = sdf.format(a.getPrecios().get(0).getFecha());
            out.println("<tr>");
            out.println("<td><form action=\"AmbitoHistoricoServlet\" method=\"GET\"><input type=\"Submit\" value=\"" + a.getRic() + "\" name=\"ric\"></form></td>");
            out.println("<td>" + a.getNombre() + "</td>");
            out.println("<td>" + a.getPrecios().get(0).getValor().toString() + "</td>");
            out.println("<td>" + fechaStr + "</td>");
            out.println("</tr>");        	
        }
        out.println("</table>");
        out.println("</BODY>");
        out.close();
        
        int ok = 0;
        int error = 0;
        for (Accion s : acciones){
        	String log = "Saving " + s.getRic();
        	try {        		
				ServiceProvider.getDao().saveAccion(s);
				log = log + " --> OK ";
				System.out.println(log);
				ok++;
			} catch (Exception e) {
				log = log + " --> ERROR ";
				System.err.println(log);
				error++;
			}
        }
        System.out.println("OK: " + ok + " ERROR: " + error + " TOTAL: " + acciones.size());        
	}

}
